#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
#include <fcntl.h>
#include <string.h>

#define BLOCK_SIZE 256*1024

unsigned char buffer[BLOCK_SIZE];
unsigned int T[BLOCK_SIZE];
long length;
unsigned int cnt[256];
unsigned int cntTotal[256];


int main(int argc, char **argv) {
  int sum = 0;
  unsigned long first;
  unsigned int i, j;
  
  for ( ; ; ) {
    if ( fread( (char *) &length, sizeof( long ), 1, stdin ) == 0 )
      break;
    fprintf( stderr, "Processing %ld bytes\n", length );
    if ( length > ( BLOCK_SIZE ) ) {
      fprintf( stderr, "Buffer mas grande!\n" );
      abort();
    }
    if ( fread( (char *)buffer, 1, (size_t) length, stdin ) != (size_t) length ) {
      fprintf( stderr, "Error leyendo data\n" );
      abort();
    }
    
    fread( (char *) &first, sizeof( long ), 1, stdin );
    fprintf( stderr, "I= %lu\n", first );
    //   
    // Los indicies del vector T los construyo a partir de F, y para conocer F,
    // que es el vector ordenado de L, lo puedo hacer conociendo cuantos caracteres
    // alfabeticamente anteriores hay previos a cada cada caracter y luego, \
    // al recorrer L, ver que instancia de cada caracter estoy recorriendo.

    // Entonces primero cuento la cantidad total de cada caracter
    // inicializo los contadores en cero
    for (i=0 ; i < 256 ; i++) {
      cnt[i] = 0;
    }
    for (i=0 ; i<length ; i++) {
      cnt[buffer[i]]++;
    }

    sum = 0;
    for (i=0 ; i< 256 ; i++) {
      cntTotal[ i ] = sum;
      sum += cnt[i];

      // lo vuelvo a inicializar en 0 para contar las intancias 
      // mientras construyo el vector T
      cnt[i] = 0;
    }
    
    
    // ahora voy consturyendo el vector T con la suma de lo anterior mas
    // la instancia de cada caracter (cantidad de cada carecter recorridos
    // hasta el momento)
    for (i = 0; i < length ; i++) {
      T[cnt[buffer[i]] + cntTotal[buffer[i]]] = i;
      cnt[buffer[i]]++;
    }

    if (0) {
     for (i=0 ; i< length; i++) {
      if ( isprint( buffer[T[i]] ) )
        fprintf( stderr, "%d: %c (%d)\n", i, buffer[T[i]], T[i] );
      else
        fprintf( stderr, "%d: <%d> (%d)\n", i, buffer[T[i]], T[i] );   
    }   
    }
    
    // Con el vector T, ya puedo recuperar la informacion original
    i = T[first];
    for ( j = 0 ; j < length ; j++) {
      if (j == 112) { 
        int a=1; 
      };
      putc(buffer[i], stdout );
      i = T[i];
    }
  }
  return 1;
}

